Imports System.Data.SqlClient
Imports System.ComponentModel

Public Class cls_documento_

    Implements ICloneable

#Region "Variables ..."
    Private int_iddocumento As Integer = 0
    Private int_tipodocumento As enu_tipodocumento = enu_tipodocumento.Compra
    Private int_tipo As enu_tipo = enu_tipo.A
    Private int_puntoventa As Integer = 0
    Private int_numero As Integer = 0
    Private dte_fecha As DateTime = New System.DateTime(Now.Year, 1, 1)
    Private int_estado As Integer = 0
    Private int_idtercero As Integer = 0
    Private str_razonsocial As String = ""
    Private int_idcondicioniva As Integer = 0
    Private str_numerofiscal As String = ""
    Private str_direccion As String = ""
    Private dec_descuento As Decimal = 0
    Private dec_descuentoP As Decimal = 0
    Private dec_recargo As Decimal = 0
    Private dec_recargoP As Decimal = 0
    Private int_idregistro As Integer = 0
    Private int_idmoneda As Integer = 0
    Private dte_cotizacionfecha As DateTime = New System.DateTime(Now.Year, 1, 1)
    Private dec_cotizacionvalor As Decimal = 0
    Private int_idtransporte As Integer
    Private int_idformapago As Integer = 0
    Private dte_vencimiento As DateTime = New System.DateTime(Now.Year, 1, 1)
    Private dte_vencimientore As DateTime = New System.DateTime(Now.Year, 1, 1)
    Private str_observaciones As String = ""
    Private int_iddocumentorelacion As Integer = 0

    Private obj_moneda As cls_moneda_
    Private obj_tercero As cls_tercero_
    Private obj_registro As cls_registro_
    Private obj_documentodetalle_ As cls_documentodetalle_
    Private obj_documentoalteracion_ As cls_documentoalteracion_
    Private obj_transporte As cls_transporte_
    Private obj_formapago As cls_formapago_

    Private obj_documentorelacion_ As cls_documento_

    Private obj_asiento As cls_asiento_
    Private obj_cajaasiento As cls_cajaasiento_

    Private col_Items As Collections.Generic.List(Of cls_documento_) = Nothing
#End Region

    Public Enum enu_tipo As Integer
        <Description("A - Factura")> A = 0
        <Description("B - Factura")> B = 1
        <Description("C - Factura")> C = 2
        <Description("X - Presupuesto")> X = 3
    End Enum

    Public Enum enu_tipodocumento As Integer
        <Description("Compra")> Compra = 0
        <Description("Pedido")> PedidoCliente = 1
        <Description("Asiento de Caja")> Caja = 3
        <Description("Manual")> Manual = 4
        <Description("Venta")> Venta = 5
        <Description("Remito")> Remito = 6
    End Enum


    Public Overrides Function ToString() As String
        Return Format(numero, "0000000000")
    End Function
#Region "Propiedades ..."
    ReadOnly Property This
        Get
            Return Me
        End Get
    End Property
    ReadOnly Property ThisDescripcion As String
        Get
            Return Me.ToString
        End Get
    End Property
    ReadOnly Property pKey
        Get
            Return iddocumento
        End Get
    End Property
    Property iddocumento() As Integer
        Get
            iddocumento = int_iddocumento
        End Get
        Set(ByVal value As Integer)
            int_iddocumento = value
        End Set
    End Property
    Property tipodocumento() As enu_tipodocumento
        Get
            tipodocumento = int_tipodocumento
        End Get
        Set(ByVal value As enu_tipodocumento)
            int_tipodocumento = value
        End Set
    End Property
    Property tipo() As enu_tipo
        Get
            tipo = int_tipo
        End Get
        Set(ByVal value As enu_tipo)
            int_tipo = value
        End Set
    End Property
    Property puntoventa() As Integer
        Get
            puntoventa = int_puntoventa
        End Get
        Set(ByVal value As Integer)
            int_puntoventa = value
        End Set
    End Property
    Property numero() As Integer
        Get
            numero = int_numero
        End Get
        Set(ByVal value As Integer)
            int_numero = value
        End Set
    End Property
    Property fecha() As DateTime
        Get
            fecha = dte_fecha
        End Get
        Set(ByVal value As DateTime)
            dte_fecha = value
        End Set
    End Property
    Property estado() As Integer
        Get
            estado = int_estado
        End Get
        Set(ByVal value As Integer)
            int_estado = value
        End Set
    End Property
    Property idtercero() As Integer
        Get
            idtercero = int_idtercero
        End Get
        Set(ByVal value As Integer)
            int_idtercero = value
        End Set
    End Property
    Property razonsocial() As String
        Get
            razonsocial = str_razonsocial
        End Get
        Set(ByVal value As String)
            str_razonsocial = value
        End Set
    End Property
    Property idcondicioniva() As Integer
        Get
            idcondicioniva = int_idcondicioniva
        End Get
        Set(ByVal value As Integer)
            int_idcondicioniva = value
        End Set
    End Property
    Property numerofiscal() As String
        Get
            numerofiscal = str_numerofiscal
        End Get
        Set(ByVal value As String)
            str_numerofiscal = value
        End Set
    End Property
    Property direccion() As String
        Get
            direccion = str_direccion
        End Get
        Set(ByVal value As String)
            str_direccion = value
        End Set
    End Property
    Property descuento As Decimal
        Get
            descuento = dec_descuento
        End Get
        Set(ByVal value As Decimal)
            dec_descuento = value
        End Set
    End Property
    Property descuentoP As Decimal
        Get
            descuentoP = dec_descuentoP
        End Get
        Set(ByVal value As Decimal)
            dec_descuentoP = value
        End Set
    End Property
    Property recargo As Decimal
        Get
            recargo = dec_recargo
        End Get
        Set(ByVal value As Decimal)
            dec_recargo = value
        End Set
    End Property
    Property recargoP As Decimal
        Get
            recargoP = dec_recargoP
        End Get
        Set(ByVal value As Decimal)
            dec_recargoP = value
        End Set
    End Property
    Property idregistro() As Integer
        Get
            idregistro = int_idregistro
        End Get
        Set(ByVal value As Integer)
            int_idregistro = value
        End Set
    End Property
    Property idmoneda As Integer
        Get
            idmoneda = int_idmoneda
        End Get
        Set(ByVal value As Integer)
            int_idmoneda = value
        End Set
    End Property
    Property cotizacionfecha As DateTime
        Get
            cotizacionfecha = dte_cotizacionfecha
        End Get
        Set(ByVal value As DateTime)
            dte_cotizacionfecha = value
        End Set
    End Property
    Property cotizacionvalor As Decimal
        Get
            cotizacionvalor = dec_cotizacionvalor
        End Get
        Set(ByVal value As Decimal)
            dec_cotizacionvalor = value
        End Set
    End Property
    Property idtransporte As Integer
        Get
            idtransporte = int_idtransporte
        End Get
        Set(value As Integer)
            int_idtransporte = value
        End Set
    End Property
    Property idformapago As Integer
        Get
            idformapago = int_idformapago
        End Get
        Set(ByVal value As Integer)
            int_idformapago = value
        End Set
    End Property
    Property vencimiento As DateTime
        Get
            vencimiento = dte_vencimiento
        End Get
        Set(ByVal value As DateTime)
            dte_vencimiento = value
        End Set
    End Property
    Property vencimientore As DateTime
        Get
            vencimientore = dte_vencimientore
        End Get
        Set(ByVal value As DateTime)
            dte_vencimientore = value
        End Set
    End Property
    Property observaciones As String
        Get
            observaciones = str_observaciones
        End Get
        Set(ByVal value As String)
            str_observaciones = value
        End Set
    End Property
    Property iddocumentorelacion As Integer
        Get
            iddocumentorelacion = int_iddocumentorelacion
        End Get
        Set(ByVal value As Integer)
            int_iddocumentorelacion = value
        End Set
    End Property
    Property formapago() As cls_formapago_
        Get
            If IsNothing(obj_formapago) Then
                obj_formapago = New cls_formapago_
                If Not obj_formapago.Buscar(idformapago) Then
                    obj_formapago = Nothing
                End If
            End If
            formapago = obj_formapago
        End Get
        Set(ByVal value As cls_formapago_)
            obj_formapago = value
        End Set
    End Property
    Property moneda() As cls_moneda_
        Get
            If IsNothing(obj_moneda) Then
                obj_moneda = New cls_moneda_
                If Not obj_moneda.Buscar(idmoneda) Then
                    obj_moneda = Nothing
                End If
            End If
            moneda = obj_moneda
        End Get
        Set(ByVal value As cls_moneda_)
            obj_moneda = value
        End Set
    End Property
    Property documentodetalle_() As cls_documentodetalle_
        Get
            If IsNothing(obj_documentodetalle_) Then
                obj_documentodetalle_ = New cls_documentodetalle_
                If Not obj_documentodetalle_.CargarXiddocumento(iddocumento) Then
                    obj_documentodetalle_ = Nothing
                End If
            End If
            documentodetalle_ = obj_documentodetalle_
        End Get
        Set(ByVal value As cls_documentodetalle_)
            obj_documentodetalle_ = value
        End Set
    End Property
    Property documentoalteracion_() As cls_documentoalteracion_
        Get
            If IsNothing(obj_documentoalteracion_) Then
                obj_documentoalteracion_ = New cls_documentoalteracion_
                If Not obj_documentoalteracion_.CargarXiddocumento(iddocumento) Then
                    obj_documentoalteracion_ = Nothing
                End If
            End If
            documentoalteracion_ = obj_documentoalteracion_
        End Get
        Set(ByVal value As cls_documentoalteracion_)
            obj_documentoalteracion_ = value
        End Set
    End Property
    Property tercero() As cls_tercero_
        Get
            If IsNothing(obj_tercero) Then
                obj_tercero = New cls_tercero_
                If Not obj_tercero.Buscar(idtercero) Then
                    obj_tercero = Nothing
                End If
            End If
            tercero = obj_tercero
        End Get
        Set(ByVal value As cls_tercero_)
            obj_tercero = value
        End Set
    End Property
    Property registro() As cls_registro_
        Get
            If IsNothing(obj_registro) Then
                obj_registro = New cls_registro_
                If Not obj_registro.Buscar(idregistro) Then
                    obj_registro = Nothing
                End If
            End If
            registro = obj_registro
        End Get
        Set(ByVal value As cls_registro_)
            obj_registro = value
        End Set
    End Property
    Property transporte() As cls_transporte_
        Get
            If IsNothing(obj_transporte) Then
                obj_transporte = New cls_transporte_
                If Not obj_transporte.Buscar(idtransporte) Then
                    obj_transporte = Nothing
                End If
            End If
            transporte = obj_transporte
        End Get
        Set(ByVal value As cls_transporte_)
            obj_transporte = value
        End Set
    End Property
    Property asiento() As cls_asiento_
        Get
            If IsNothing(obj_asiento) Then
                obj_asiento = New cls_asiento_
                If Not obj_asiento.BuscarXtipoXiddocumento(tipodocumento, iddocumento) Then
                    obj_asiento = Nothing
                End If
            End If
            asiento = obj_asiento
        End Get
        Set(ByVal value As cls_asiento_)
            obj_asiento = value
        End Set
    End Property
    Property cajaasiento() As cls_cajaasiento_
        Get
            If IsNothing(obj_cajaasiento) Then
                obj_cajaasiento = New cls_cajaasiento_
                If Not obj_cajaasiento.BuscarXiddocumento(iddocumento) Then
                    obj_cajaasiento = Nothing
                End If
            End If
            cajaasiento = obj_cajaasiento
        End Get
        Set(ByVal value As cls_cajaasiento_)
            obj_cajaasiento = value
        End Set
    End Property
    Property documentorelacion_() As cls_documento_
        Get
            If IsNothing(obj_documentorelacion_) Then
                obj_documentorelacion_ = New cls_documento_
                If Not obj_documentorelacion_.CargarXiddocumentorelacion(iddocumento) Then
                    obj_documentorelacion_ = Nothing
                End If
            End If
            documentorelacion_ = obj_documentorelacion_
        End Get
        Set(ByVal value As cls_documento_)
            obj_documentorelacion_ = value
        End Set
    End Property
    Property Items() As Collections.Generic.List(Of cls_documento_)
        Get
            Items = col_Items
        End Get
        Set(ByVal value As Collections.Generic.List(Of cls_documento_))
            col_Items = value
        End Set
    End Property

#End Region

    Private Sub CargarColeccion(ByVal obj_Reader As SqlDataReader)
        col_Items = New Collections.Generic.List(Of cls_documento_)
        While obj_Reader.Read()
            Dim Elemento As New cls_documento_
            Elemento.int_iddocumento = (obj_Reader.GetValue(obj_Reader.GetOrdinal("iddocumento")))

            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tipodocumento"))) = False Then
                Elemento.int_tipodocumento = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tipodocumento")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo"))) = False Then
                Elemento.int_tipo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("puntoventa"))) = False Then
                Elemento.int_puntoventa = (obj_Reader.GetValue(obj_Reader.GetOrdinal("puntoventa")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("numero"))) = False Then
                Elemento.int_numero = (obj_Reader.GetValue(obj_Reader.GetOrdinal("numero")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha"))) = False Then
                Elemento.dte_fecha = (obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("estado"))) = False Then
                Elemento.int_estado = (obj_Reader.GetValue(obj_Reader.GetOrdinal("estado")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idtercero"))) = False Then
                Elemento.int_idtercero = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idtercero")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("razonsocial"))) = False Then
                Elemento.str_razonsocial = (obj_Reader.GetValue(obj_Reader.GetOrdinal("razonsocial")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idcondicioniva"))) = False Then
                Elemento.int_idcondicioniva = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idcondicioniva")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("numerofiscal"))) = False Then
                Elemento.str_numerofiscal = (obj_Reader.GetValue(obj_Reader.GetOrdinal("numerofiscal")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("direccion"))) = False Then
                Elemento.str_direccion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("direccion")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro"))) = False Then
                Elemento.int_idregistro = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro")))
            End If

            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("descuento"))) = False Then
                Elemento.dec_descuento = (obj_Reader.GetValue(obj_Reader.GetOrdinal("descuento")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("descuentoP"))) = False Then
                Elemento.dec_descuentoP = (obj_Reader.GetValue(obj_Reader.GetOrdinal("descuentoP")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("recargo"))) = False Then
                Elemento.dec_recargo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("recargo")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("recargoP"))) = False Then
                Elemento.dec_recargoP = (obj_Reader.GetValue(obj_Reader.GetOrdinal("recargoP")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idmoneda"))) = False Then
                Elemento.int_idmoneda = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idmoneda")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("cotizacionfecha"))) = False Then
                Elemento.dte_cotizacionfecha = (obj_Reader.GetValue(obj_Reader.GetOrdinal("cotizacionfecha")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("cotizacionvalor"))) = False Then
                Elemento.dec_cotizacionvalor = (obj_Reader.GetValue(obj_Reader.GetOrdinal("cotizacionvalor")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idtransporte"))) = False Then
                Elemento.int_idtransporte = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idtransporte")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idformapago"))) = False Then
                Elemento.int_idformapago = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idformapago")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("vencimiento"))) = False Then
                Elemento.dte_vencimiento = (obj_Reader.GetValue(obj_Reader.GetOrdinal("vencimiento")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("vencimientore"))) = False Then
                Elemento.dte_vencimientore = (obj_Reader.GetValue(obj_Reader.GetOrdinal("vencimientore")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("observaciones"))) = False Then
                Elemento.str_observaciones = (obj_Reader.GetValue(obj_Reader.GetOrdinal("observaciones")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("iddocumentorelacion"))) = False Then
                Elemento.int_iddocumentorelacion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("iddocumentorelacion")))
            End If

            col_Items.Add(Elemento)
        End While
    End Sub

    Private Sub CargarVariables(ByVal obj_Reader As SqlDataReader)
        obj_Reader.Read()
        int_iddocumento = (obj_Reader.GetValue(obj_Reader.GetOrdinal("iddocumento")))

        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tipodocumento"))) = False Then
            int_tipodocumento = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tipodocumento")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo"))) = False Then
            int_tipo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("puntoventa"))) = False Then
            int_puntoventa = (obj_Reader.GetValue(obj_Reader.GetOrdinal("puntoventa")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("numero"))) = False Then
            int_numero = (obj_Reader.GetValue(obj_Reader.GetOrdinal("numero")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha"))) = False Then
            dte_fecha = (obj_Reader.GetValue(obj_Reader.GetOrdinal("fecha")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("estado"))) = False Then
            int_estado = (obj_Reader.GetValue(obj_Reader.GetOrdinal("estado")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idtercero"))) = False Then
            int_idtercero = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idtercero")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("razonsocial"))) = False Then
            str_razonsocial = (obj_Reader.GetValue(obj_Reader.GetOrdinal("razonsocial")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idcondicioniva"))) = False Then
            int_idcondicioniva = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idcondicioniva")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("numerofiscal"))) = False Then
            str_numerofiscal = (obj_Reader.GetValue(obj_Reader.GetOrdinal("numerofiscal")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("direccion"))) = False Then
            str_direccion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("direccion")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro"))) = False Then
            int_idregistro = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro")))
        End If

        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("descuento"))) = False Then
            dec_descuento = (obj_Reader.GetValue(obj_Reader.GetOrdinal("descuento")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("descuentoP"))) = False Then
            dec_descuentoP = (obj_Reader.GetValue(obj_Reader.GetOrdinal("descuentoP")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("recargo"))) = False Then
            dec_recargo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("recargo")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("recargoP"))) = False Then
            dec_recargoP = (obj_Reader.GetValue(obj_Reader.GetOrdinal("recargoP")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idmoneda"))) = False Then
            int_idmoneda = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idmoneda")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("cotizacionfecha"))) = False Then
            dte_cotizacionfecha = (obj_Reader.GetValue(obj_Reader.GetOrdinal("cotizacionfecha")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("cotizacionvalor"))) = False Then
            dec_cotizacionvalor = (obj_Reader.GetValue(obj_Reader.GetOrdinal("cotizacionvalor")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idtransporte"))) = False Then
            int_idtransporte = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idtransporte")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idformapago"))) = False Then
            int_idformapago = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idformapago")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("vencimiento"))) = False Then
            dte_vencimiento = (obj_Reader.GetValue(obj_Reader.GetOrdinal("vencimiento")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("vencimientore"))) = False Then
            dte_vencimientore = (obj_Reader.GetValue(obj_Reader.GetOrdinal("vencimientore")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("observaciones"))) = False Then
            str_observaciones = (obj_Reader.GetValue(obj_Reader.GetOrdinal("observaciones")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("iddocumentorelacion"))) = False Then
            int_iddocumentorelacion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("iddocumentorelacion")))
        End If
    End Sub

    Public Function Nuevo(Optional ByVal ObtenerID As Boolean = False) As Boolean
        Nuevo = False
        Dim obj_Conexion As New cls_Conexion
        Try

            'Creacion de registro----------------------------------------------------
            If IsNothing(obj_registro) Then
                registro = New cls_registro_
                registro.fechacreado = Now
                registro.idusuariocreado = UsuarioLOG.idusuario
                registro.fechamodificado = Now
                registro.idusuariomodificado = UsuarioLOG.idusuario
                registro.idregistroestado = 1
                registro.idusuarioregistroestado = UsuarioLOG.idusuario
                registro.Nuevo(True)
                idregistro = obj_registro.idregistro
            End If
            '------------------------------------------------------------------------

            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "documento__Nuevo"
                .Parameters.Add("@tipodocumento", SqlDbType.Int).Value = int_tipodocumento
                .Parameters.Add("@tipo", SqlDbType.Int).Value = int_tipo
                .Parameters.Add("@puntoventa", SqlDbType.Int).Value = int_puntoventa
                .Parameters.Add("@numero", SqlDbType.Int).Value = int_numero
                .Parameters.Add("@fecha", SqlDbType.DateTime).Value = dte_fecha
                .Parameters.Add("@estado", SqlDbType.Int).Value = int_estado
                .Parameters.Add("@idtercero", SqlDbType.Int).Value = int_idtercero
                .Parameters.Add("@razonsocial", SqlDbType.NVarChar).Value = str_razonsocial
                .Parameters.Add("@idcondicioniva", SqlDbType.Int).Value = int_idcondicioniva
                .Parameters.Add("@numerofiscal", SqlDbType.NVarChar).Value = str_numerofiscal
                .Parameters.Add("@direccion", SqlDbType.NVarChar).Value = str_direccion
                .Parameters.Add("@descuento", SqlDbType.Decimal).Value = dec_descuento
                .Parameters.Add("@descuentoP", SqlDbType.Decimal).Value = dec_descuentoP
                .Parameters.Add("@recargo", SqlDbType.Decimal).Value = dec_recargo
                .Parameters.Add("@recargoP", SqlDbType.Decimal).Value = dec_recargoP
                .Parameters.Add("@idmoneda", SqlDbType.Int).Value = int_idmoneda
                .Parameters.Add("@cotizacionfecha", SqlDbType.DateTime).Value = dte_cotizacionfecha
                .Parameters.Add("@cotizacionvalor", SqlDbType.Decimal).Value = dec_cotizacionvalor
                .Parameters.Add("@idtransporte", SqlDbType.Int).Value = int_idtransporte
                .Parameters.Add("@idformapago", SqlDbType.Int).Value = int_idformapago
                .Parameters.Add("@vencimiento", SqlDbType.DateTime).Value = dte_vencimiento
                .Parameters.Add("@vencimientore", SqlDbType.DateTime).Value = dte_vencimientore
                .Parameters.Add("@observaciones", SqlDbType.NVarChar).Value = str_observaciones
                .Parameters.Add("@iddocumentorelacion", SqlDbType.Int).Value = int_iddocumentorelacion

                .Parameters.Add("@idregistro", SqlDbType.Int).Value = int_idregistro
                .ExecuteNonQuery()
            End With
            Nuevo = True
            CargarUltimo()

            'Creacion de documentodetalle_--------------------------------------------------
            If Not IsNothing(documentodetalle_) Then
                If Not IsNothing(documentodetalle_.Items) Then
                    For Each documentodetalle As cls_documentodetalle_ In documentodetalle_.Items
                        documentodetalle.iddocumento = iddocumento
                        documentodetalle.Nuevo(True)
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion de documentoalteracion_--------------------------------------------------
            If Not IsNothing(documentoalteracion_) Then
                If Not IsNothing(documentoalteracion_.Items) Then
                    For Each documentoalteracion As cls_documentoalteracion_ In documentoalteracion_.Items
                        documentoalteracion.iddocumento = iddocumento
                        documentoalteracion.Nuevo(True)
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion de asiento--------------------------------------------------
            If Not IsNothing(asiento) Then
                asiento.iddocumento = iddocumento
                asiento.tipo = tipodocumento
                asiento.idtercero = idtercero
                asiento.Nuevo()
            End If
            '-------------------------------------------------------------------------

        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Crear el registro de documento_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Function

    Public Sub Modificar()
        Dim obj_Conexion As New cls_Conexion
        Try
            'Modificacion de registro------------------------------------------------
            registro.fechamodificado = Now : registro.idusuariomodificado = UsuarioLOG.idusuario
            registro.Modificar()
            '------------------------------------------------------------------------

            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "documento__Modificar"
                .Parameters.Add("@iddocumento", SqlDbType.Int).Value = int_iddocumento
                .Parameters.Add("@tipodocumento", SqlDbType.Int).Value = int_tipodocumento
                .Parameters.Add("@tipo", SqlDbType.Int).Value = int_tipo
                .Parameters.Add("@puntoventa", SqlDbType.Int).Value = int_puntoventa
                .Parameters.Add("@numero", SqlDbType.Int).Value = int_numero
                .Parameters.Add("@fecha", SqlDbType.DateTime).Value = dte_fecha
                .Parameters.Add("@estado", SqlDbType.Int).Value = int_estado
                .Parameters.Add("@idtercero", SqlDbType.Int).Value = int_idtercero
                .Parameters.Add("@razonsocial", SqlDbType.NVarChar).Value = str_razonsocial
                .Parameters.Add("@idcondicioniva", SqlDbType.Int).Value = int_idcondicioniva
                .Parameters.Add("@numerofiscal", SqlDbType.NVarChar).Value = str_numerofiscal
                .Parameters.Add("@direccion", SqlDbType.NVarChar).Value = str_direccion
                .Parameters.Add("@descuento", SqlDbType.Decimal).Value = dec_descuento
                .Parameters.Add("@descuentoP", SqlDbType.Decimal).Value = dec_descuentoP
                .Parameters.Add("@recargo", SqlDbType.Decimal).Value = dec_recargo
                .Parameters.Add("@recargoP", SqlDbType.Decimal).Value = dec_recargoP
                .Parameters.Add("@idregistro", SqlDbType.Int).Value = int_idregistro
                .Parameters.Add("@idmoneda", SqlDbType.Int).Value = int_idmoneda
                .Parameters.Add("@cotizacionfecha", SqlDbType.DateTime).Value = dte_cotizacionfecha
                .Parameters.Add("@cotizacionvalor", SqlDbType.Decimal).Value = dec_cotizacionvalor
                .Parameters.Add("@idtransporte", SqlDbType.Int).Value = int_idtransporte
                .Parameters.Add("@idformapago", SqlDbType.Int).Value = int_idformapago
                .Parameters.Add("@vencimiento", SqlDbType.DateTime).Value = dte_vencimiento
                .Parameters.Add("@vencimientore", SqlDbType.DateTime).Value = dte_vencimientore
                .Parameters.Add("@observaciones", SqlDbType.NVarChar).Value = str_observaciones
                .Parameters.Add("@iddocumentorelacion", SqlDbType.Int).Value = int_iddocumentorelacion

                .ExecuteNonQuery()
            End With

            'Creacion/modificacion de produccionresultado-------------------------------------
            If Not IsNothing(documentodetalle_) Then
                If Not IsNothing(documentodetalle_.Items) Then
                    For Each documentodetalle As cls_documentodetalle_ In documentodetalle_.Items
                        If documentodetalle.iddocumentodetalle = 0 Then
                            documentodetalle.iddocumento = iddocumento
                            documentodetalle.Nuevo(True)
                        Else
                            documentodetalle.Modificar()
                        End If
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion/modificacion de produccionresultado-------------------------------------
            If Not IsNothing(documentoalteracion_) Then
                If Not IsNothing(documentoalteracion_.Items) Then
                    For Each documentoalteracion As cls_documentoalteracion_ In documentoalteracion_.Items
                        If documentoalteracion.iddocumentoalteracion = 0 Then
                            documentoalteracion.iddocumento = iddocumento
                            documentoalteracion.Nuevo(True)
                        Else
                            documentoalteracion.Modificar()
                        End If
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion/Modificacion de asiento--------------------------------------------------
            If Not IsNothing(asiento) Then
                asiento.iddocumento = iddocumento
                asiento.tipo = tipodocumento
                If asiento.idasiento = 0 Then
                    asiento.Nuevo()
                Else
                    asiento.Modificar()
                End If
            End If
            '-------------------------------------------------------------------------

        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Modificar el registro de documento_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Sub

    Public Sub Eliminar(ByVal iddocumento As Integer)
        Dim obj_Conexion As New cls_Conexion
        Try
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "documento__Eliminar"
                .Parameters.Add("@iddocumento", SqlDbType.Int).Value = iddocumento
                .ExecuteNonQuery()
            End With
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Eliminar el registro de documento_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Sub

    Public Function Buscar(ByVal iddocumento As Integer) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            Buscar = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "documento__Buscar"
                .Parameters.Add("@iddocumento", SqlDbType.Int).Value = iddocumento
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarVariables(obj_Reader)
                Buscar = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Buscar el registro de documento_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Sub CargarUltimo()
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "documento__CargarUltimo"
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarVariables(obj_Reader)
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarUltimo registro de documento_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Sub

    Public Function CargarTodos() As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarTodos = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "documento__CargarTodos"
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarTodos = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarTodos los registros de documento_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function CargarXtipodocumento(ByVal prm_int_tipodocumento As enu_tipodocumento, Optional ByVal idregistroestado As Integer = 1) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarXtipodocumento = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "documento__CargarXtipodocumento"
                .Parameters.Add("@tipodocumento", SqlDbType.Int).Value = prm_int_tipodocumento
                .Parameters.Add("@idregistroestado", SqlDbType.Int).Value = idregistroestado
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarXtipodocumento = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarXtipodocumento los registros de documento_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function CargarXfechaXtipodocumento(ByVal desde As DateTime, ByVal hasta As DateTime, ByVal prm_int_tipodocumento As enu_tipodocumento) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarXfechaXtipodocumento = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "documento__CargarXfechaXtipodocumento"
                .Parameters.Add("@tipodocumento", SqlDbType.Int).Value = prm_int_tipodocumento
                .Parameters.Add("@desde", SqlDbType.DateTime).Value = desde
                .Parameters.Add("@hasta", SqlDbType.DateTime).Value = hasta
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarXfechaXtipodocumento = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarXfechaXtipodocumento los registros de documento_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function CargarXfechaXtipodocumentoXidtransporte(ByVal desde As DateTime, ByVal hasta As DateTime, ByVal prm_int_tipodocumento As enu_tipodocumento, ByVal prm_int_idtransporte As Integer) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarXfechaXtipodocumentoXidtransporte = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "documento__CargarXfechaXtipodocumentoXidtransporte"
                .Parameters.Add("@tipodocumento", SqlDbType.Int).Value = prm_int_tipodocumento
                .Parameters.Add("@desde", SqlDbType.DateTime).Value = desde
                .Parameters.Add("@hasta", SqlDbType.DateTime).Value = hasta
                .Parameters.Add("@idtransporte", SqlDbType.Int).Value = prm_int_idtransporte
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarXfechaXtipodocumentoXidtransporte = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarXfechaXtipodocumentoXidtransporte los registros de documento_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function


    Public Function CargarXiddocumentorelacion(ByVal prm_iddocumentorelacion As Integer) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarXiddocumentorelacion = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "documento__CargarXiddocumentorelacion"
                .Parameters.Add("@iddocumentorelacion", SqlDbType.Int).Value = prm_iddocumentorelacion
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarXiddocumentorelacion = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarXiddocumentorelacion los registros de documento_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim obj_documento_Clon As New cls_documento_
        obj_documento_Clon.int_iddocumento = Me.int_iddocumento
        obj_documento_Clon.int_tipodocumento = Me.int_tipodocumento
        obj_documento_Clon.int_tipo = Me.int_tipo
        obj_documento_Clon.int_puntoventa = Me.int_puntoventa
        obj_documento_Clon.int_numero = Me.int_numero
        obj_documento_Clon.dte_fecha = Me.dte_fecha
        obj_documento_Clon.int_estado = Me.int_estado
        obj_documento_Clon.int_idtercero = Me.int_idtercero
        obj_documento_Clon.str_razonsocial = Me.str_razonsocial
        obj_documento_Clon.int_idcondicioniva = Me.int_idcondicioniva
        obj_documento_Clon.str_numerofiscal = Me.str_numerofiscal
        obj_documento_Clon.str_direccion = Me.str_direccion
        obj_documento_Clon.int_idregistro = Me.int_idregistro

        obj_documento_Clon.dec_descuento = Me.dec_descuento
        obj_documento_Clon.dec_descuentoP = Me.dec_descuentoP
        obj_documento_Clon.dec_recargo = Me.dec_recargo
        obj_documento_Clon.dec_recargoP = Me.dec_recargoP

        obj_documento_Clon.int_idmoneda = Me.int_idmoneda
        obj_documento_Clon.dte_cotizacionfecha = Me.dte_cotizacionfecha
        obj_documento_Clon.dec_cotizacionvalor = Me.dec_cotizacionvalor
        obj_documento_Clon.int_idtransporte = Me.int_idtransporte

        obj_documento_Clon.col_Items = Me.col_Items
        Return obj_documento_Clon
    End Function

    Public Sub Totales(ByRef prm_subtotal As Decimal, ByRef prm_neto As Decimal, ByRef prm_otros As Decimal, ByRef prm_iva As Decimal, ByRef prm_total As Decimal)
        Dim subtotal As Decimal
        Dim neto As Decimal
        Dim otros As Decimal
        Dim IVA As Decimal

        If Not IsNothing(documentodetalle_.Items) Then
            For Each detalle As cls_documentodetalle_ In documentodetalle_.Items
                subtotal += detalle.cantidad * detalle.valor
                'parche sergio iva desactiva facturacion produccion
                IVA += (detalle.recargoP * detalle.valorfinal) / 100
            Next
        End If

        neto = subtotal
        neto += recargo
        neto -= descuento

        otros = 0
        If Not IsNothing(documentoalteracion_) Then
            If Not IsNothing(documentoalteracion_.Items) Then
                For Each alteracion As cls_documentoalteracion_ In documentoalteracion_.Items
                    Select Case alteracion.tipo
                        Case cls_alteracion_.enu_tipo.Valor
                            otros += alteracion.formula
                        Case cls_alteracion_.enu_tipo.Porcentaje
                            otros += Math.Round((alteracion.formula * subtotal) / 100, int_cantdecimales)
                    End Select
                Next
            End If
        End If


        neto += otros

        'If tipo = enu_tipo.A Then
        '    IVA = neto * 0.21
        'Else
        '    IVA = 0
        'End If

        prm_subtotal = subtotal
        prm_neto = neto
        prm_otros = otros
        prm_iva = IVA
        prm_total = neto + IVA
    End Sub


End Class
